package dubbo;
/**
 * 1.dubbo架构设计
 *      1.五个角色：
 *          1.注册中心：服务注册与发现
 *          2.服务提供者：暴露服务
 *          3.服务消费者：远程调用服务
 *          4.监控中心：统计服务调用次数和时间
 *          5.容器：服务允许容器
 *      2.调用流程：
 *          1.container容器负责启动、加载、运行provider
 *          2.provider在启动时，向registry中心注册自己提供的服务
 *          3.consumer在启动时，向registry中心订阅自己所需的服务
 *          4.registry返回服务提供者列表给consumer，
 *          5.consumer调用provider服务，基于负载均衡算法
 *          6.consumer调用provider统计，每分钟统计一次到monitor
 *      3.分层
 *          1.接口服务层：面向开发者，业务代码、接口、实现等
 *          2.配置层：对外配置接口，以ServiceConfig和ReferenceConfig为中心
 *          3.服务代理层：对生成者和消费者、dubbo都会产生一个代理封装类封装调用细节
 *          4.服务注册层：封装服务地址注册和发现
 *          5.路由层：封装多个提供者的路由和负载均衡，并桥接注册中心
 *          6.监控层：RPC调用次数和时间监控
 *          7.远程调用层：封装RPC调用
 *          8.信息交换层：封装请求响应模式
 *          9.网络传输层：抽象mina和Netty为统一接口，统一网络传输
 *          10.数据序列化层：数据的序列化和反序列化
 * 2.dubbo和springcloud区别
 *      1.rpc协议，http超文本传输协议
 *      2.内部系统调用，也支持外部系统调用，比较方便
 *      3.zk,nacos和euraka,nacos
 *      4.二进制传输,占用带宽小和json文本传输，占用带宽大
 *      5.springcloud有网关，分布式配置，消息总线，数据流，断路器等配套组件
 *      6.dubbo开发难度会更高点
 * 3.dubbo集群容错策略
 *      1.失败自动切换：重试次数为1次，默认
 *      2.失败自动恢复：调用失败后，定时任务每隔5秒对调用进行重试
 *      3.快速失败：只会调用一次，失败后立即返回异常
 *      4.失败安全：返回空结果，记录日志不抛出
 *      5.并行调用多个服务提供者：创建线程池，并发调用多个provider，直到一个返回结果
 *      6.广播模式：逐个调用provider，如果一台报错，循环调用结束后抛出异常，适用于缓存更新
 * 4.dubbo服务导出(服务暴露)：
 *      1.注解是@DubboService或者@Service的可以解析参数，服务名，接口名，超时时间等自定义参数，生成ServiceBean
 *      2.将服务信息注册到注册中心上，如果有多个协议或者多个注册中心，就会生成多个ServiceBean
 *      3.服务注册到注册中心还会绑定一些监听器
 *      4.根据服务协议启动对应的web框架
 * 5.dubbo服务引入
 *      1.使用@Refrence注解引入一个服务，解析注解和服务信息
 *      2.从注册中心查询此服务，缓存到本地
 *      3.绑定监听器监听服务配置的变化
 *      4.根据查询得到的服务提供者信息生产服务接口代理对象，放入spring中
 * 6.dubbo支持的协议
 *      1.dubbo协议
 *      2.http协议
 *      3.hessian协议
 *      4.RMI协议
 *      5.webservice协议
 * 7.dubbo支持的负载均衡策略
 *      1.随机
 *      2.轮询
 *      3.最小活跃调用
 *      4.一致性哈希
 * 8.spi
 *      1.定义：主要用于框架中，框架定义好接口，不同的使用者有不同的需求，实现这个接口即可，spi定义一个特定的位置，创建一个以服务接口命名的文件，
 *        然后文件里面记录的是此jar包提供的具体实现类的全限定类名,可以通过接口找到对应的文件，获取具体的实现类然后加载
 *      1.dubbo的spi
 *          1.dubbo spi的使用了弥补了java spi的缺点，在使用扩展点的时候可以只实例化指定的实现类，并不会把所有的实现类都实现
 *          2.比如你项目中引入了oracle和Mysql的spi，dubbo可以指定加载一个
 *      2.java的spi   spi包下，有一个仿造shardingsphere的spi机制的功能
 *          1.位置在META-INF/services底下，使用serviceLoader去获取，然后自由使用
 * 9.为什么dubbo用自己的spi不用Java的
 *      1.因为java spi会一次性将实现类全部实例化，耗时，但是你代码用不到，dubbo通过键值对，通过值去文件中找对应的实现类
 * 10.如何设计一个rpc框架
 *      1.高性能网络传输模型：netty
 *      2.自定义传输协议，序列化协议
 *      3.集群，容错，负载功能的实现，需要注册中心
 *      4.监控机制，比如服务调用量，服务心跳检测等
 *
 * @author
 * @created 2022/1/17 21:00
 */
public class Dubbo {
}
